//// : annotations/database/TableCreationProcessorFactory.java
//// The database example using Visitor.
//// {Exec: apt -factory
//// annotations.database.TableCreationProcessorFactory
//// database/Member.java -s database}
//package annotations.database;
//
//import com.sun.mirror.apt.*;
//import com.sun.mirror.declaration.*;
//import com.sun.mirror.util.*;
//import java.util.*;
//import static com.sun.mirror.util.DeclarationVisitors.*;
//
//public class TableCreationProcessorFactory implements AnnotationProcessorFactory {
//  public AnnotationProcessor getProcessorFor(
//      Set<AnnotationTypeDeclaration> atds, AnnotationProcessorEnvironment env) {
//    return new TableCreationProcessor(env);
//  }
//
//  public Collection<String> supportedAnnotationTypes() {
//    return Arrays.asList(
//        "annotations.database.DBTable",
//        "annotations.database.Constraints",
//        "annotations.database.SQLString",
//        "annotations.database.SQLInteger");
//  }
//
//  public Collection<String> supportedOptions() {
//    return Collections.emptySet();
//  }
//
//  private static class TableCreationProcessor implements AnnotationProcessor {
//    private final AnnotationProcessorEnvironment env;
//    private String sql = "";
//
//    public TableCreationProcessor(AnnotationProcessorEnvironment env) {
//      this.env = env;
//    }
//
//    public void process() {
//      for (TypeDeclaration typeDecl : env.getSpecifiedTypeDeclarations()) {
//        typeDecl.accept(getDeclarationScanner(new TableCreationVisitor(), NO_OP));
//        sql = sql.substring(0, sql.length() - 1) + ");";
//        System.out.println("creation SQL is :\n" + sql);
//        sql = "";
//      }
//    }
//
//    private class TableCreationVisitor extends SimpleDeclarationVisitor {
//      public void visitClassDeclaration(ClassDeclaration d) {
//        DBTable dbTable = d.getAnnotation(DBTable.class);
//        if (dbTable != null) {
//          sql += "CREATE TABLE ";
//          sql += (dbTable.name().length() < 1) ? d.getSimpleName().toUpperCase() : dbTable.name();
//          sql += " (";
//        }
//      }
//
//      public void visitFieldDeclaration(FieldDeclaration d) {
//        String columnName = "";
//        if (d.getAnnotation(SQLInteger.class) != null) {
//          SQLInteger sInt = d.getAnnotation(SQLInteger.class);
//          // Use field name if name not specified
//          if (sInt.name().length() < 1) columnName = d.getSimpleName().toUpperCase();
//          else columnName = sInt.name();
//          sql += "\n    " + columnName + " INT" + getConstraints(sInt.constraints()) + ",";
//        }
//        if (d.getAnnotation(SQLString.class) != null) {
//          SQLString sString = d.getAnnotation(SQLString.class);
//          // Use field name if name not specified.
//          if (sString.name().length() < 1) columnName = d.getSimpleName().toUpperCase();
//          else columnName = sString.name();
//          sql +=
//              "\n    "
//                  + columnName
//                  + " VARCHAR("
//                  + sString.value()
//                  + ")"
//                  + getConstraints(sString.constraints())
//                  + ",";
//        }
//      }
//
//      private String getConstraints(Constraints con) {
//        String constraints = "";
//        if (!con.allowNull()) constraints += " NOT NULL";
//        if (con.primaryKey()) constraints += " PRIMARY KEY";
//        if (con.unique()) constraints += " UNIQUE";
//        return constraints;
//      }
//    }
//  }
//} /// :~
